package od.one;

/**
 * @author: Shelly
 * @create: 2024-01-30 15:00:52
 * @version: 1.0
 * @describe: 机器人仓库搬砖
 * 题目描述
 * 机器人搬砖，一共有N堆砖存放在N个不同的仓库中，第i堆砖中有bricks[i]块砖头，要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格，机器人一个小时中只能在一个仓库中搬砖，机器人的能量格每小时补充一次且能量格只在这一个小时有效，为使得机器人损耗最小化尽量减小每次补充的能量格数 为了保障在8小时内能完成搬砖任务，请计算每小时给机器人充能的最小能量格数。
 * 1、无需考虑机器人补充能量格的耗时，
 * 2、无需考虑机器人搬砖的耗时；
 * 3、机器人每小时补充能量格只在这一个小时中有效；
 * 输入描述
 * 第一行为一行数字，空格分隔
 * 输出描述
 * 机器人每小时最少需要充的能量格，若无法完成任务，输出-1
 * 示例1
 * 输入	301225819
 * 输出	15
 *
 * 示例2
 * 输入	10122581986417192030
 * 输出	-1
 */
public class OD19 {
}
/*
* 解题思路
1.首先，检查砖块的数量是否大于8，如果大于8，则返回-1。在本例中，砖块数量为5，因此不返回-1。
2.初始化左右边界left 和right。left 设置为1 (因为至少需要每小时1块能量) , right 设置为数组中的最大值(即30) 。
3.进入while循环执行二分查找。这个循环将不断缩小搜索范围直到找到最小的每小时能量块数量。
4.在每次循环中，计算中间值 middle，然后计算使用middle作为每小时能量块数量时，完成搬运所有砖块需要的总时间 total time。
5.如果 total time 大于 hours, 说明middle太小, 不能在规定时间内完成任务, 因此将 left 设置为 middle + 1。
6.如果total time小于等于 hours , 说明middle 可能太大或刚好合适, 因此将 right 设置为 middle以尝试找到更小的值。
7.当left 和right 相遇时，循环结束，此时left 即为我们寻找的最小能量块数量。
8.最后，再次计算使用left 作为每小时能量块数量时，完成搬运所有砖块需要的总时间 sum。 如果 sum 大于 hours，说明即使是 left 也不能在规定时间内完成任务，因此返回-1。
9.如果sum小于等于 hours，则 left 是可以在规定时间内完成任务的最小能量块数量，返回left 。
现在，我们来分析给定的用例：
· 输入:  30 12 25 8 19
· 输出:  15
执行过程如下：
1.初始化 left = 1和right = 30。
2.进入循环, 计算middle。
3.第一次循环: middle = (1 + 30) / 2 = 15, 计算total time为 2 + 1 + 2 + 1 + 2 = 8。 因为 total time等于hours, 所以right更新为 15。
4.第二次循环: middle = (1 + 15) / 2 = 8, 计算 total time为 4 + 2 + 4 + 1 + 3 = 14。 因为 total time 大于 hours, 所以left 更新为9。
5.第三次循环: middle = (9 + 15) / 2 = 12 , 计算 total time为3               。 因为 total time 大于 hours, 所以left 更新为13。
6.第四次循环: middle = (13 + 15) / 2 = 14 , 计算total time 为 3 + 1 + 2 + 1 + 2 = 9。 因为 total time大于hours, 所以left 更新为15。
7.第五次循环: middle = (15 + 15) / 2 = 15 , 由于 left 已经等于 right, 循环结束。
8.最后,  left 为15, 计算 sum为 2 + 1 + 2 + 1 + 2 = 8, 等于 hours, 因此返回15。
所以，对于给定的输入 30 12 25 8 19 ，输出应该是15，这表明每小时至少需要充能15块能量格，才能在8小时内完成搬砖任务。
* */